package com.smart.community.feign.property.fallback;

import java.util.Collections;
import java.util.List;

import org.springframework.stereotype.Component;

import com.smart.community.commons.cache.DataScopeInfo;
import com.smart.community.feign.common.BaseFeignFallbackFactory;
// 移除DataScopeType导入，不再使用
import com.smart.community.feign.property.service.DataScopeFeign;

import lombok.extern.slf4j.Slf4j;

/**
 * 数据权限Feign接口回滚工厂
 * 
 * 当数据权限服务调用失败时，提供降级处理：
 * 1. 返回安全的默认值，避免调用方异常
 * 2. 记录详细的错误日志，便于问题排查
 * 3. 确保系统稳定性，避免级联故障
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 * @updated 2025-08-28 - 继承BaseFeignFallbackFactory，使用统一的降级处理标准
 */
@Slf4j
@Component
public class DataScopeFeignFallbackFactory extends BaseFeignFallbackFactory<DataScopeFeign> {
    
    @Override
    public DataScopeFeign create(Throwable cause) {
        // 使用基类的统一日志记录方法，区分异常类型
        if (isServiceUnavailable(cause)) {
            logServiceUnavailable(getServiceName(), cause);
        } else {
            log.warn("{}服务调用异常，执行降级处理: {}", getServiceName(), cause.getMessage());
        }
        
        return new DataScopeFeign() {
            
            @Override
            public DataScopeInfo getUserDataScope(Long userId) {
                logMethodFallback("getUserDataScope", userId);
                // 返回默认的DataScopeInfo，避免调用方NPE
                // 使用新的构造函数，确保身份字段完整初始化
                DataScopeInfo fallbackDataScope = new DataScopeInfo(
                        userId,
                        Collections.emptyList(),
                        Collections.emptyList(),
                        Collections.emptyList(), // householdIds参数
                        "普通用户，无数据权限"
                    );
                
                // 明确设置身份字段，避免构造函数中的判断逻辑问题
                fallbackDataScope.setSuperAdmin(false);
                fallbackDataScope.setPropertyCompanyUser(false);
                fallbackDataScope.setOwnerUser(false);
                
                return fallbackDataScope;
            }
            
            @Override
            public Boolean hasPropertyCompanyPermission(Long userId, Long propertyCompanyId) {
                logMethodFallback("hasPropertyCompanyPermission", userId, propertyCompanyId);
                // 权限检查失败时，默认返回false，确保安全性
                return false;
            }
            
            @Override
            public Boolean hasCommunityPermission(Long userId, Long communityId) {
                logMethodFallback("hasCommunityPermission", userId, communityId);
                // 权限检查失败时，默认返回false，确保安全性
                return false;
            }
            
            @Override
            public void clearAllPermissionCache() {
                logMethodFallback("clearAllPermissionCache");
                // 缓存清除失败时，忽略操作，不影响业务
            }
            
            @Override
            public List<Long> getUserCommunityIds(Long userId) {
                logMethodFallback("getUserCommunityIds", userId);
                // 返回空列表，避免调用方NPE
                return Collections.emptyList();
            }
            
            @Override
            public List<Long> getUserPropertyCompanyIds(Long userId) {
                logMethodFallback("getUserPropertyCompanyIds", userId);
                // 返回空列表，避免调用方NPE
                return Collections.emptyList();
            }
            
            @Override
            public Boolean isPropertyCompanyUser(Long userId) {
                logMethodFallback("isPropertyCompanyUser", userId);
                // 判断失败时，默认返回false
                return false;
            }
            
            @Override
            public void refreshUserPermissionCache(Long userId) {
                logMethodFallback("refreshUserPermissionCache", userId);
                // 缓存刷新失败时，忽略操作，不影响业务
            }
            
            @Override
            public Boolean isUserSuperAdmin(Long userId) {
                logMethodFallback("isUserSuperAdmin", userId);
                // 判断失败时，默认返回false，确保安全性
                return false;
            }
            
            @Override
            public Boolean validateBatchPropertyCompanyPermission(Long userId, List<Long> propertyCompanyIds) {
                logMethodFallback("validateBatchPropertyCompanyPermission", userId, propertyCompanyIds);
                // 权限验证失败时，默认返回false，确保安全性
                return false;
            }
            
            @Override
            public List<Long> getAuthorizedCommunityIds(Long userId, List<Long> communityIds) {
                logMethodFallback("getAuthorizedCommunityIds", userId, communityIds);
                // 返回空列表，避免调用方NPE
                return Collections.emptyList();
            }
            
            @Override
            public Boolean hasModulePermission(Long userId, String moduleCode) {
                logMethodFallback("hasModulePermission", userId, moduleCode);
                // 权限验证失败时，默认返回false，确保安全性
                return false;
            }

			@Override
			public List<Long> getUserIdsByPropertyCompanyIds(List<Long> propertyCompanyIds) {
				logMethodFallback("getUserIdsByPropertyCompanyIds", propertyCompanyIds);
                // 返回空列表，避免调用方NPE
                return Collections.emptyList();
			}
        };
    }
    
    @Override
    protected String getServiceName() {
        return "数据权限服务";
    }
}
